React基础
React环境
下载安装or更新node
更新node和npm至新版(要求:Node >= 6 and npm >= 5.2)
创建 React App
1 | npx create-react-app my-app |
项目代码精简
项目入口:index.js
内容写在:APP.js
什么是组件
网页整个是一个组件,各个部分也是一个组件。
只要是页面上的一部分,就是一个组件。eg.网页上的标签
index.js
1 | // react:让浏览器理解<App />组件的语法 |
App.js
1 | import React from 'react'; |
JSX语法
允许在react中,直接使用标签<>结构
注释:{/ /}
class样式为:className,否则会被认为是组件类的class
label的for标签为:htmlFor,否则会被认为是for循环关键字
实战TodoList
React 面向数据编程,不实际操作Dom
数据
构造函数中控制数据
1 | // Todolist组件的构造函数,组件创造的瞬间,自动执行。 |
展示列表
1 | <ul> |
新增列表
- input输入内容后:将输入框内容的值初始化为inputValue,其改变的时候自动更新inputValue中
- button点击后:将inputValue加载在list中最后一位,清空inputValue。
1 | // 1 添加任务 |
删除列表
数据项被点击后:
- 获取index值,作为删除函数输入
- 复制list于const list
- 删除list中index的数据项
- 在更新原list(不直接操作list),setState操作
1 | // 2 删除任务 |
其他
用bind方法保持this上下文
写法一,直接写在HTML标签内:
1 | <button onClick={this.handleBtnClick.bind(this)}>add</button> |
若不绑定,则handleBtnClick()函数中的this则指的是button,而不是组件props本身。
写法二,写在构造函数中:提升代码执行性能(底层内容)
render()只能返回return一个包裹标签
1 | render() { |
✨组件通信
父组件向子组件传值:父组件的属性
父组件通过属性的方式向子组件传递参数
子组件通过props的形式接收父组件传递的参数
子组件向父组件传值:通过调用父组件的方法改变数据
CSS
行内样式 style
1 | /* 外层{}表示为JS表达式;里面的{}表达式为JS的对象*/ |
className的方法(不能使用class关键字,react中的class关键字表示定义一个组件)
1 | <button className='red-btn' onClick={this.handleBtnClick}>add</button> |
步骤:关键字className,定义css文件,在入口处index.js引入css文件
###
代码优化
1 | // setState性能优化的方式:函数的形式变为异步的setState |
1 | // 新方法: |
关于React的思考
声明式开发
减少大量dom操作代码量
可以和其他框架并存
react只去管理id=”root”的div的渲染。jQuery可以管理其他div操作。
组件化
- 区分组件
和标签 xxx - 组件之间通信:
- 父向子:属性
- 子向父:调用父组件的方法
单向数据流
父组件可以向子组件传值(只读),子组件不能去改变这个值。
why单项数据流:防止其中一个改变时出现bug,难以定位是哪一个组件改变导致的错误。
视图层框架
只解决数据和渲染的问题,不解决react复杂传值问题,可以借助其他redux等数据传递框架
函数式编程
代码逻辑清晰:拆分函数,各司其职;
前端自动化测试便捷:只需要给函数一个数值,查看输出是否符合预期。